import Vue from 'vue';
// 样式初始化
import 'css/reset.css';
import 'css/minx.less';
import { Message } from 'element-ui';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

/* 引入Vant */
import Vant from 'vant';
import 'vant/lib/index.css';
Vue.use(Vant);

import router from './router';
import store from './store';
import { getToken } from '@/utils/auth';
import { isRelogin } from '@/utils/request';

NProgress.configure({ showSpinner: false });

const whiteList = ['/license', '/login', '/auth-redirect', '/bind', '/register', '/oauthLogin'];

router.beforeEach((to, from, next) => {
    NProgress.start();
    if (getToken()) {
        to.meta.title && store.dispatch('settings/setTitle', to.meta.title);
        /* has token*/
        if (to.path === '/login') {
            next({ path: '/' });
            NProgress.done();
        } else {
            if (store.getters.roles.length === 0) {
                isRelogin.show = true;
                // 判断当前用户是否已拉取完user_info信息
                store
                    .dispatch('GetInfo')
                    .then(() => {
                        isRelogin.show = false;
                        store.dispatch('GenerateRoutes').then((accessRoutes) => {
                            // 根据roles权限生成可访问的路由表
                            router.addRoutes(accessRoutes); // 动态添加可访问路由表
                            next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
                        });
                    })
                    .catch((err) => {
                        store.dispatch('LogOut').then(() => {
                            Message.error(err);
                            next({ path: '/' });
                        });
                    });
            } else {
                next();
            }
        }
    } else {
        // 没有token
        if (whiteList.indexOf(to.path) !== -1) {
            // 在免登录白名单，直接进入
            next();
        } else {
            const { share } = to.query;
            if (share) {
                next();
                return;
            }
            next(`/login?redirect=${to.fullPath}`); // 全部重定向到登录页
            NProgress.done();
        }
    }
});

router.afterEach(() => {
    NProgress.done();
});
// 组件自动化全局注册
const requireComponent = require.context(
    // 其组件目录的相对路径
    './components/drag',
    // 是否查询其子目录
    true,
    // 匹配基础组件文件名的正则表达式
    /\.vue$/
);
requireComponent.keys().forEach((fileName) => {
    // 获取组件配置
    const componentConfig = requireComponent(fileName);
    // 全局注册组件
    Vue.component(
        componentConfig.default.name, // 此处的name,是组件属性定义的name
        // 如果这个组件选项是通过 `export default` 导出的，
        // 那么就会优先使用 `.default`，
        // 否则回退到使用模块的根。
        componentConfig.default
    );
    if (!componentConfig) {
        console.error(`组件加载失败: ${fileName}`);
        return;
    }
});
